package com.xjh.basestudy.javabase.thread.maipiao1;

public class SellTicket implements Runnable {
    //应该把这个对象锁定义在外面，如果直接定义在synchronized里面，会让每个线程都生成一把锁，不起作用
    private Object obj = new Object();
    private int tickets =100;
    @Override
    public void run() {
        while(true) {
            synchronized (obj) {
                if (tickets > 0) {
                    //通过sleep()方法来模拟出票时间
                    try {
                        Thread.sleep(100);
                        //t1线程执行到这休息了100ms
                        //t2线程抢到了cpu的执行权，开始执行，执行到这里的时候t2休息100ms
                        //t3线程抢到了cpu的执行权，开始执行，执行到这里的时候t3休息100ms
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //假设按照顺序醒过来
                    //t1抢到cup执行权，在控制台输出正在出售倒数第100张票
                    //t2抢到cup执行权，在控制台输出正在出售倒数第100张票
                    //t3抢到cup执行权，在控制台输出正在出售倒数第100张票
                    System.out.println(Thread.currentThread().getName() + "正在出售倒数第" + tickets + "张票");
                    //进行三次--的操作票直接变成97（第一种情况：输出语句减票操作分开执行）
                    tickets--;
                    //票出现0和负数的原因（第二种情况：输出语句减票操作一起执行），当一个线程输出票并减去票以后，另一个线程才醒过来，在0的基础上又减去票
                }
            }
        }
    }
}
